
    EventListener.implement
    (
        {
            /**
             * @private
             * The execution scope to use when invoking #method
             * @type {Object}
             * @see #method
             */
            scope: null
            
            /**
             * @private
             * The method to be invoked when handling an event;
             * @type {Function}
             * @see #scope
             */
        ,   method: null
        
            /**
             * Handle an event.
             * @param {EventObject} value
             * @return {void}
             * @throws {Error}
             */
        ,   handleEvent: function (value) 
            {
                this.method.call(this.scope, value);
            }
            
            /**
             * Determine if this event listener is equal to another. Two
             * event listeners are considered equal if they have the same
             * sope and the same method properties.
             * @param {Object} value
             * @return {Boolean}
             */
        ,   equals: function (value) 
            {
                if (EventListener.is(value)) 
                {
                    return this === value 
                    || this.scope === value.scope && this.method === value.method;
                } 
                
                return false;   
            }
        }
    );
    
    /**
     * Create a new EventListener.
     * @param {Function} method
     * @param {Object} [scope]
     * @constructor
     */
    function EventListener (method, scope) 
    {
        if (false === Function.is(method))
            throw new TypeError('Function expected');
            
        this.method= method;
        this.scope= scope;
    };
